package com.example.sprintboot.mapper;

import com.example.sprintboot.entity.Interaction;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 用户交互Mapper接口
 */
@Mapper
public interface InteractionMapper {

    /**
     * 根据ID查询交互记录
     */
    Interaction selectById(@Param("id") Integer id);

    /**
     * 查询所有交互记录
     */
    List<Interaction> selectAll();

    /**
     * 根据用户ID查询交互记录
     */
    List<Interaction> selectByUserId(@Param("userId") Integer userId);

    /**
     * 根据内容查询交互记录
     */
    List<Interaction> selectByContent(@Param("contentType") String contentType, @Param("contentId") Integer contentId);

    /**
     * 根据交互类型查询
     */
    List<Interaction> selectByType(@Param("type") Integer type);

    /**
     * 查询用户对特定内容的交互记录
     */
    List<Interaction> selectByUserAndContent(@Param("userId") Integer userId, 
                                           @Param("contentType") String contentType, 
                                           @Param("contentId") Integer contentId);

    /**
     * 检查用户是否已经对内容进行过某种交互
     */
    Interaction selectUserInteraction(@Param("userId") Integer userId, 
                                    @Param("contentType") String contentType, 
                                    @Param("contentId") Integer contentId, 
                                    @Param("type") Integer type);

    /**
     * 插入交互记录
     */
    int insert(Interaction interaction);

    /**
     * 更新交互记录（主要用于更新评分）
     */
    int update(Interaction interaction);

    /**
     * 删除交互记录
     */
    int deleteById(@Param("id") Integer id);

    /**
     * 删除用户的特定交互
     */
    int deleteUserInteraction(@Param("userId") Integer userId, 
                            @Param("contentType") String contentType, 
                            @Param("contentId") Integer contentId, 
                            @Param("type") Integer type);

    /**
     * 统计交互总数
     */
    int count();

    /**
     * 统计用户的交互数量
     */
    int countByUserId(@Param("userId") Integer userId);

    /**
     * 统计内容的交互数量
     */
    int countByContent(@Param("contentType") String contentType, @Param("contentId") Integer contentId);

    /**
     * 统计某种交互类型的数量
     */
    int countByType(@Param("type") Integer type);


    /**
     * 条件查询
     */
    List<Interaction> selectByCondition(@Param("userId") Integer userId,
                                      @Param("contentType") String contentType,
                                      @Param("contentId") Integer contentId,
                                      @Param("type") Integer type,
                                      @Param("offset") Integer offset,
                                      @Param("limit") Integer limit);

    /**
     * 条件统计
     */
    int countByCondition(@Param("userId") Integer userId,
                        @Param("contentType") String contentType,
                        @Param("contentId") Integer contentId,
                        @Param("type") Integer type);

    /**
     * 获取内容的点赞数
     */
    int getLikeCount(@Param("contentType") String contentType, @Param("contentId") Integer contentId);

    /**
     * 获取内容的收藏数
     */
    int getFavoriteCount(@Param("contentType") String contentType, @Param("contentId") Integer contentId);

    /**
     * 获取内容的浏览数
     */
    int getViewCount(@Param("contentType") String contentType, @Param("contentId") Integer contentId);

    /**
     * 获取内容的平均评分
     */
    Double getAverageRating(@Param("contentType") String contentType, @Param("contentId") Integer contentId);

    /**
     * 获取内容的评分统计
     */
    List<Map<String, Object>> getRatingStatistics(@Param("contentType") String contentType, @Param("contentId") Integer contentId);

    /**
     * 获取用户活跃度统计
     */
    List<Map<String, Object>> getUserActivityStatistics(@Param("userId") Integer userId);

    /**
     * 获取热门内容（按交互数量排序）
     */
    List<Map<String, Object>> getPopularContent(@Param("contentType") String contentType, @Param("limit") Integer limit);

    /**
     * 获取用户推荐内容（基于交互历史）
     */
    List<Map<String, Object>> getRecommendedContent(@Param("userId") Integer userId, @Param("limit") Integer limit);
}
